#ifndef __LINKEDLIST_H__
#define __LINKEDLIST_H__

typedef void (*linkedlist_visitor)(int);

typedef struct listnode {
    // 节点的值
    int val;
    // 指向链表下一个元素的指针
    struct listnode *next;
} listnode;

typedef struct linkedlist {
    unsigned int length;
    listnode *head;
} linkedlist;

/**
 * 创建一个新的单链表
 * @return 返回新创建的链表
 */
extern linkedlist *new_linkedlist();

/**
 * 返回链表的长度
 * @param list 顺序表的指针
 */
extern unsigned int linkedlist_length(const linkedlist *list);

/**
 * 向链表中第position个节点后面插入新元素
 * @param list 链表节点指针
 * @param val  待插入的元素
 * @param position 插入位置
 * @return 链表指针
 */
extern linkedlist* linkedlist_insert(linkedlist *list, int val, int position);

/**
 * 向单链表中追加元素
 * @param list 单链表指针
 * @param val  要追加的元素
 */
extern linkedlist* linkedlist_append(linkedlist* list, int val);

/**
 * 移除链表中指定位置的节点
 * @param list 链表
 * @param position 要移除的节点的位置
 * @return 移除节点的值
 */
extern int linkedlist_remove(linkedlist* list, int position);

/**
 * 遍历单链表
 */
extern void linkedlist_for_each(linkedlist* list, linkedlist_visitor visitor);

/**
 * 销毁单链表
 */
extern void linkedlist_release(linkedlist* list);

/**
 * 链表是否为空
 */
extern int linkedlist_empty(linkedlist* list);

/**
 * 访问链表的第position个位置的元素
 * @param position 元素位置
 */
extern int linkedlist_get_at(linkedlist* list, int position);

/**
 * 修改链表的第position个位置的元素
 * @param val 新的值
 * @param position 元素位置
 */
extern void linkedlist_set_at(linkedlist* list, int val, int position);

#endif